package dominio.ubicaciones

import com.fasterxml.jackson.annotation.JsonIgnore
import dominio.datos.Caracteristica
import dominio.individuos.CuidadorAjeno
import dominio.individuos.CuidadorEnTrampa
import dominio.individuos.Informante
import dominio.investigacion.Caso
import dominio.investigacion.Mapamundi
import java.util.ArrayList
import java.util.List
import org.uqbar.commons.model.ObservableUtils
import org.uqbar.commons.model.UserException
import org.uqbar.commons.utils.Observable
import org.eclipse.xtend.lib.annotations.Accessors
import dominio.factory.FactoryGame

@Accessors
@Observable
class Pais {
	
	String nombre
	@JsonIgnore Caso caso;
	List<Lugar> lugares
	List<Caracteristica> caracteristicas 
	@JsonIgnore List<Pais> conexiones
	
	List<String> nombresConexiones
	
	@JsonIgnore	Mapamundi mapamundi
	boolean tieneNombreValido
	
	new() {
		this.lugares = new ArrayList<Lugar>
		this.caracteristicas = new ArrayList<Caracteristica>
		this.conexiones = new ArrayList<Pais>
		this.nombresConexiones = new ArrayList<String>
		this.tieneNombreValido = false
	}
	
	new(String nombre) {
		new Pais => [ it.nombre = nombre ]
	}
	
	def siguientePais(){
		caso.siguiente(this)
	}
	
	def eliminarConexion(Pais pais) {
		pais.conexiones.remove(this)
		conexiones.remove(pais)
		ObservableUtils.firePropertyChanged(this,"conexiones", conexiones)
		ObservableUtils.firePropertyChanged(pais,"conexiones", pais.conexiones)
	}
	
	def agregarConexion(Pais pais) {
		conexiones += pais
		pais.conexiones += this
		nombresConexiones += pais.nombre
		pais.nombresConexiones += this.nombre
		ObservableUtils.firePropertyChanged(this, "conexiones", conexiones)
		ObservableUtils.firePropertyChanged(pais, "conexiones", pais.conexiones)
	}
	
	def agregarLugar(Lugar lugar) {
		if(lugares.size < 3) lugares += lugar
		else throw new UserException("Solo puede tener 3 (tres) lugares")
		ObservableUtils.firePropertyChanged(this, "lugares", lugares)
	}
	
	def tieneLosLugaresRequeridos() {
		lugares.size == 3
	}
	
	def esNombreValido() {
		nombre = nombre.trim
		nombre.length > 0
		
	}
	
	def mismoPais(Pais pais) {
		this.nombre == pais.nombre
	}
	
	def setearInformantes() {
		lugares.forEach[l | l.ocupante = new Informante(l)]
	}
	
	def setearCuidadores() {
		lugares.forEach[l | l.ocupante = new CuidadorAjeno]
	}
	
	def setearVillano() {
		var randomIndex = (Math.random*(lugares.size - 1)).intValue
		lugares.get(randomIndex).ocupante = caso.responsable
		lugares.forEach[l | if(l.ocupante == null) l.ocupante = new CuidadorEnTrampa]
	}
	
	def borrarConexion(Pais pais) {
		this.conexiones.remove(pais)
	}
	
	def static void main(String[] args) {
		print(new FactoryGame())
	}
	
	
}